package com.sz.biz.logistics.serialno.service;

import com.sz.biz.logistics.core.entity.Service;
import com.sz.biz.logistics.serialno.dto.ManualSetupSectionDto;
import com.sz.biz.logistics.serialno.dto.NoBatchGenerateUserDto;
import com.sz.biz.logistics.serialno.dto.SerialNoImportSuccessResultDto;
import com.sz.biz.logistics.serialno.dto.SerialNoRuleDetailDto;
import com.sz.biz.logistics.serialno.entity.SerialNoManagement;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;

import java.util.List;
import java.util.Map;

/**
 * Function: 单号管理相关功能接口 <br>
 * Author: Johnboy <br>
 * Date: 2017-12-07 17:13:00
 */
public interface NoManagementService {
    
    /**
     * 保存单号
     * @param serialNoManagement 单号信息
     */
    void save(SerialNoManagement serialNoManagement);
    
    /**
     * 渠道单号批次号条件查询
     * @param params 查询条件集合
     * @return 符合条件的数据库记录封装
     */
    QResultDto findChannelBatchNoByQueryParams(QueryParams params);
    
    /**
     * 运单号批次号查询
     * @param params 查询条件集合
     * @param productGroup 产品组id
     * @param refParentGroup 产品组父id
     * @return 符合条件的数据库记录封装
     */
    QResultDto findWaybillBatchNoByQueryParams(QueryParams params,int productGroup,int refParentGroup);
    
    /**
     * 查询批次创建者信息
     * @param batchNo 批次号
     * @param type 用户类型 分为用户和系统
     * @return 创建者信息
     */
    NoBatchGenerateUserDto queryCreateUserDetail(String batchNo,int type);

    /**
     * 渠道单号条件查询
     * @param params 查询条件集合
     * @param type 类型
     * @return 符合条件的数据库记录封装
     */
    QResultDto findChannelNoByQueryParams(QueryParams params,int type);
    
    /**
     * 根据规则生成渠道单号
     * @param ruleId 规则id
     * @return 是否生成成功
     */
    boolean generateChannelNoByRule(int ruleId);

    /**
     * 使用渠道单号
     * @param refUid 服务的uid
     * @param orderNo 订单号
     * @return 被使用的渠道单号
     */
    @Deprecated
    String useChannelNo(String refUid, String orderNo);
    
    /**
     * 使用渠道单号
     * @param refUid 服务Uid
     * @param orderNo 订单号
     * @param oldNumberId 旧渠道单号，供换单使用
     * @return 被使用的渠道单号
     */
    SerialNoManagement useChannelNo(String refUid, String orderNo,long oldNumberId);

    /**
     * 使用运单号
     * @param refUid 产品Uid
     * @param refId  二级产品组id
     * @param orderNo 订单号
     * @param customerId 客户id
     * @return 被使用的运单号
     */
    @Deprecated
    String useWaybillNo(String refUid,Integer refId,String orderNo,int customerId);
    
    /**
     * 使用运单号
     * @param refUid 产品Uid
     * @param refId  二级产品组id
     * @param orderNo 订单号
     * @param customerId 客户id
     * @param oldNumberId 旧运单号，供换单使用
     * @return 被使用的运单号
     */
    SerialNoManagement useWaybillNo(String refUid, Integer refId, String orderNo, int
            customerId,long oldNumberId);
    
    /**
     * 保存渠道单号列表
     * @param serialNoImportSuccessResultDtos 渠道单号导入结果封装
     * @param serviceUid 服务Uid
     */
    void saveChannelNoList(List<SerialNoImportSuccessResultDto> serialNoImportSuccessResultDtos, String serviceUid);

    /**
     * excel导入中 不属于任何规则的 导入
     * @param channelNos  单号list
     * @param service  服务
     */
     void importNoByService(List<String> channelNos , Service service);

    /**
     * 未使用的单号数量（不包含已知重复的）
     * @param ruleId 规则id
     * @return 规则中剩余的可用单号数目
     */
    int getResidueNumberByServiceUidRuleIdAndBatchNo(Integer ruleId);

    /**
     * 当前规则手动生成和自动生成的单号中最大的一个单号
     * @param ruleId 规则id
     * @return 该规则当前的最大已使用单号
     */
    String findMaxNumberByRuleId(int ruleId);

    /**
     * 自动生成的批量插入
     * @param paramMap 条件集合
     * @param createType 单号创建方式 0 自动 1 手动  2 excel导入
     */
    void batchInsert(Map<String, Object> paramMap,int createType);

    /**
     * 手动生成单号之后的批量插入
     * @param paramMap 条件集合
     * @param type 1:渠道单号  2：运单号
     */
    void manualBatchInsert(Map<ManualSetupSectionDto, List<String>> paramMap, int type);

    /**
     * 自动生成单号
     * @param channelNoRule 单号规则
     * @param createType  单号创建方式 0 自动 1 手动  2 excel导入
     */
    void generateChannelNo(SerialNoRuleDetailDto channelNoRule, int createType);

    /**
     * 条件合理性检查
     * @param refUid   type=1  refUid 服务(必填)  type=2  refUid 产品（可选）
     * @param refId   type=1 : refId 供应商Id(可不填)  type=2 refId=(产品组)
     * @param number  单号
     * @param type 1:渠道单号 2:运单号
     * @return 条件是否合理
     */
    boolean checkIsLegal(String refUid,Integer refId,String number,int type,String orderNo);


    /**
     * 批量获取运单号
     * @param refUid 产品uid
     * @param refId  产品组id
     * @param orderNos  该产品的所有订单号
     * @param customerId  客户id
     * @param ids 不可用单号ids
     * @return 运单号信息列表
     */
    List<SerialNoManagement> getWayBillNos(List<Long> ids, String refUid, Integer refId, List<String> orderNos, int
            customerId);
}
